import {
  login,
  getInfo,
  getDetailInfo
} from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { resetRouter } from '@/router'

const getDefaultState = () => {
  return {
    token: getToken(),
    name: '',
    avatar: '',
    // 用户信息
    userInfo: null
  }
}

const state = getDefaultState()

const mutations = {
  RESET_STATE: (state) => {
    Object.assign(state, getDefaultState())
  },
  SET_TOKEN: (state, token) => {
    state.token = token
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  },
  updateload(state, updateload) {
    // 判断userInfo是否有值
    if (state.userInfo) {
      // 展开并合并
      state.userInfo = {
        ...state.userInfo,
        ...updateload
      }
    } else {
      state.userInfo = updateload
    }
  },
  clearInfo(state) {
    state.userInfo = null
  }
}
// actions返回值是Promise实例
// 参数store里面有一个commit属性,对象解构赋值
// userInfo是index.vue传过来的表单数据
const actions = {
  // 登录
  async login({ commit }, userInfo) {
    const {
      username,
      password
    } = userInfo
    // 调用login接口,把值传递给后台,得到后台的值
    const res = await login({
      mobile: username.trim(),
      password: password
    })
    if (res.code === 10000) {
      // 登录成功
      commit('SET_TOKEN', res.data)
      // 缓存token
      setToken(res.data)
      // 返回一个promise实例
      return Promise.resolve(true)
    } else {
      // 登录失败
      return Promise.reject(false)
    }
  },

  // 获取用户信息
  async getInfo({ commit, state }) {
    const res = await getInfo()
    commit('updateload', res.data)
  },

  // 获取用户对象
  async getDetailInfo(context, id) {
    // 调用接口
    const res = await getDetailInfo(id)
    // 如果状态码===10000
    if (res.code === 10000) {
      // 更新到mutation
      context.commit('updateload', res.data)
    }
  },

  // 退出登录
  logout({ commit }) {
    // 删除vuex中的token
    commit('SET_TOKEN', '')
    // 清除token
    removeToken()
    // 删除用户信息
    commit('clearInfo')
    // 重置路由为静态路由
    resetRouter()
    // 清除vuex中的动态路由
    // 在局部模块中默认只能触发当前模块的mutation，如果想触发全局或者其他模块的mutation
    // 需要添加第三个参数 { root: true }
    commit('permission/setRoutes', [], { root: true })
  },

  // remove token
  resetToken({ commit }) {
    return new Promise(resolve => {
      removeToken() // must remove  token  first
      commit('RESET_STATE')
      resolve()
    })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

